package demo3;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 姚东名
 * Date: 2024-05-29
 * Time: 17:42
 */

/**
 * Object 类中存在一个 clone 方法, 调用这个方法可以创建一个对象的 "拷贝". 但是要想合法调用 clone 方法, 必须要
 * 先实现 Cloneable 接口, 否则就会抛出 CloneNotSupportedException 异常.
 */
public class Test {
    public static void main(String[] args)
            throws CloneNotSupportedException {
        Person person1 = new Person("zhangsan", 19);
        //把person1的内容拷贝一份
        /** 1.protected Object clone() throws CloneNotSupportedException
         * 修饰限定符是protected 在不同的包中，clone()方法只能在子类中使用，所以Person类在没有 implements Cloneable之前，它就会在Test类中显示不出来
         * 2.public interface Cloneable { }
         * 所以clone必须在Person类中进行重写
         * 3.clone()是Object类的方法，Object类是所有类的父类，只能重写clone()方法
         * 4.因为返回值是是Object，所以得进行向下转型 -> (Person)person1.clone();
         * 5.有一个异常的东西，得先处理，不然会报错 -> throws CloneNotSupportedException
         */
        //1.浅拷贝：把person1所指向的对象克隆一份出来，虽然内容相同，但是不是存储在不同的空间中
        Person person2 = (Person)person1.clone();

        System.out.println("修改前："+person1.m.money);
        System.out.println("修改前："+person2.m.money);

        person2.m.money = 999.9;

        System.out.println("修改后："+person1.m.money);//999.9 -> 9.9 因为只改了person2的money值，不影响person1的money值
        System.out.println("修改后："+person2.m.money);//999.9
        //证明：只克隆了Person对象，没有克隆Money对象
        /*System.out.println(person2);*/
        //2.深拷贝：连Money也克隆了，那么就是深拷贝
    }
}
